/**
 * Response工具类，用于简化HTTP响应的构建和发送
 * 主要提供了成功响应和失败响应的快捷方法
 */
package hyj.qx.kuaican.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import hyj.qx.kuaican.Vo.ResultVO;
import hyj.qx.kuaican.model.ErrorCode;


import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 发送成功响应的方法
 *
 */
public class ResponseUtil {
    public static <T> void success(HttpServletResponse response, JSON jsonObject) {
        PrintWriter out = null;
        try {
            // 设置响应的内容类型和字符集
            response.setContentType("application/json;charset=utf-8");
            // 创建成功的ResultVO对象，封装响应数据
            ResultVO<Object> resp = new ResultVO<>(jsonObject);
            // 获取响应输出流
            out = response.getWriter();
            // 写入经过JSON格式化的响应数据，并确保空值也能被正确序列化
            out.write(JSONObject.toJSONString(resp, SerializerFeature.WriteMapNullValue));
            // 刷新输出流并关闭
            out.flush();
            out.close();
        } catch (IOException e) {
            // 如果发生IO异常，抛出运行时异常
            throw new RuntimeException(e);
        }
    }

    /**
     * 发送失败响应的方法
     *
     * @param response HTTP响应对象，用于设置响应头和输出流
     * @param errorCode 错误码对象，包含错误代码和消息
     */
    public static void fail(HttpServletResponse response, ErrorCode errorCode) {
        PrintWriter out = null;
        try {
            // 设置响应的内容类型和字符集
            response.setContentType("application/json;charset=utf-8");
            // 创建失败的ResultVO对象
            ResultVO<Object> resp = new ResultVO<>();
            // 设置响应为失败，并封装错误代码和消息
            resp.setSuccess(false);
            resp.setCode(errorCode.getCode());
            resp.setMessage(errorCode.getMessage());
            // 获取响应输出流
            out = response.getWriter();
            // 写入经过JSON格式化的响应数据
            out.write(JSONObject.toJSONString(resp));
            // 刷新输出流并关闭
            out.flush();
            out.close();
        } catch (IOException e) {
            // 如果发生IO异常，抛出运行时异常
            throw new RuntimeException(e);
        }
    }
}
